<?php

class Random
{

    static function Int($min=null, $max=null)
    {
        if (is_null($min) && is_null($max)) {
            return rand();
        } else {
            return rand($min, $max);
        }
    }

    static function Word($syllables, $max_length = 0)
    {
        $ret = '';
        for ($i=0; $i<$syllables; $i++) {
            $add = Random::Syllable();
            if ($max_length) {
                if ((strlen($ret) + strlen($add)) > $max_length) {
                    break;
                }
            }
            $ret .= $add;
        }
        return $ret;
    }

    static function Syllable()
    {
        $ret = Random::Consonant() . Random::Vowel();
        if (Random::TrueEach(4)) {
            $ret .= Random::TrueEach(3)
                ?
                Random::Vowel() :
                Random::Consonant();
        }
        return $ret;
    }

    static function Consonant()
    {
        return Random::Enum(array ( 'q', 'w', 'r', 't', 'p', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm' ));
    }

    static function Vowel()
    {
        return Random::Enum(array ( 'e', 'y', 'u', 'i', 'o', 'a' ));
    }

    static function Letter()
    {
        return Random::TrueEach(3) ? Random::Vowel() : Random::Consonant();
    }

    static function Sign()
    {
        return Random::Enum(array ( '`', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '_', '=', '+', '\\', '|', '[', ']', '{', '}', ';', ':', '\'', '"', ',', '.', '<', '>', '/', '?' ));
    }

    static function CapitalLetter()
    {
        return strtoupper(Random::Letter());
    }

    static function FirstName()
    {
        return ucfirst(Random::Word(Random::Int(2, 3)));
    }

    static function LastName()
    {
        return ucfirst(Random::Word(Random::Int(3, 4)));
    }

    static function FullName()
    {
        return Random::FirstName() . ' ' . Random::LastName();
    }

    static function Email()
    {
        return Random::Login() . '@' . Random::Domain();
    }

    static function Domain()
    {
        $fd = array (
            'com',
            'org',
            'net',
            'com.us',
            'org.us',
            'net.us',
        );
        return Random::Word(Random::Int(2, 3)) . '.' . Random::Enum($fd);
    }

    static function IP()
    {
        return implode('.', array ( Random::Int(0, 255), Random::Int(0, 255), Random::Int(0, 255), Random::Int(0, 255) ));
    }

    static function SQLDateTime($min, $max)
    {
        return date('Y-m-d H:i:s', Random::Int($min, $max));
    }

    static function DateTime($min, $max)
    {
        return date('m/d/Y H:i:s', Random::Int($min, $max));
    }

    static function Decimal($num, $precision)
    {
        return Random::Int(0, pow(10, $num)) / pow(10, $precision);
    }

    static function Enum($enum)
    {
        return $enum[Random::Int(0, count($enum)-1)];
    }

    static function Set($set, $min, $max)
    {
        $num = Random::Int($min, $max);
        $ret = array ();
        for ($i=0; $i<$num; $i++) {
            $ret[] = Random::Enum($set);
        }
        return $ret;
    }

    static function Login()
    {
        $ret = Random::Word(Random::Int(2, 3));
        if (Random::TrueEach(3)) {
            $ret .= Random::Enum(array ( '.', '_', '-' ));
            $ret .= Random::Word(Random::Int(2, 3));
        }

        return $ret;
    }

    static function Password()
    {
        $num = Random::Int(5, 7);
        $ret = '';
        for ($i=0; $i<$num; $i++) {
            $ret .= Random::TrueEach(3) ?
                        Random::Sign() :
                        (Random::TrueEach(2) ?
                            Random::Syllable() :
                            Random::Int(0, 9));
        }

        for ($i=0; $i<strlen($ret); $i++) {
            if (Random::TrueEach(2)) {
                $ret[$i] = strtoupper($ret[$i]);
            }
        }

        return $ret;
    }

    static function TrueEach($num)
    {
        return Random::Int(0, $num*100) % $num == 0;
    }

}

?>